package org.example;


//监听者上下文 用于存储监听者

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;


import java.util.HashSet;
import java.util.Set;



@Service
//监听者容器 用于管理服务发现的监听者  T
//TODO  暂无监听器下线机制  问题不大 以后再说 先这样 或者可以周期长的心跳 后续要考虑服务发现挂了或者nacos挂了的情况
public class ListenerContext {
    @Autowired
    private RestTemplate restTemplate;


    //这些监听器无差别 每次通知所有的监听器
    private final Set<ServiceChangeListener> listeners=new HashSet<>();

    public void addListener(ServiceChangeListener listener) {
        listeners.add(listener);
    }


    //移除监听者 暂时不知道怎么用
    public void removeListener(ServiceChangeListener listener) {
        listeners.remove(listener);
    }


    @Async("myExecutor")
    //根据事件类型 通知所有的监听器
    public void notifyListeners(ServiceChangeEvent event) {
        for (ServiceChangeListener listener : listeners) {
            listener.onServiceChanged(event, restTemplate);
        }
    }


    public Set<ServiceChangeListener> getListeners() {
        return listeners;
    }

}
